//
//  BaseNetManager.m
//  MyPhoneApp
//
//  Created by uuu9 on 16/9/8.
//  Copyright © 2016年 myApp. All rights reserved.
//

#import "BaseNetManager.h"
#import "sys/utsname.h"
#import <CoreTelephony/CTCarrier.h>
#import <CoreTelephony/CTTelephonyNetworkInfo.h>
#import "Account.h"
#import "U9CustomeError.h"

static AFHTTPSessionManager *manager;
static NSString *secdata;

@implementation BaseNetManager

+ (AFHTTPSessionManager *)sharedInstance
{
    static dispatch_once_t t;
    dispatch_once(&t, ^{
        manager = [AFHTTPSessionManager manager];
//        manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html", nil];
          manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/html",@"image/png",@"text/html;charset=UTF-8",@"text/plain", nil];
        [manager.requestSerializer setTimeoutInterval:20.f];
        manager.requestSerializer = [AFHTTPRequestSerializer serializer];
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    });
    return manager;
}


+ (void)GET:(NSString *)path parameters:(NSDictionary *)params completionHandler:(void(^)(id responseObj, NSError *error))complete{
    if (!secdata) {
        [self getSecData];
    }
    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:params];
    //    [dict setObject:secdata forKey:@"_secdata"];
    [[self sharedInstance] GET:path
                    parameters:dict
                      progress:nil
                       success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
                           //                           NSLog(@"responseObj  %@",responseObject);
                           id dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
                           complete(dict, nil);
                       } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                           complete(nil, error);
                       }];
}


+ (void)POST:(NSString *)path parameters:(NSString *)params completionHandler:(void(^)(id responseObj, NSError *error))complete{
    if (!secdata) {
        [self getSecData];
    }
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:secdata forKey:@"_secdata"];
    if (params) {
        [dict setObject:params forKey:@"param"];
    }
    
    [[self sharedInstance] POST:path
                     parameters:dict
                       progress:nil
                        success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
                            id dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
                            complete(dict, nil);
                        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                            complete(nil, error);
                        }];
}


+ (void)POSTBase64:(NSString *)path parameters:(NSString *)params completionHandler:(void(^)(id responseObj, NSError *error))complete{
    if (!secdata) {
        [self getSecData];
    }
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:secdata forKey:@"_secdata"];
    if (params) {
        [dict setObject:[self base64Encoding:params] forKey:@"param"];
    }
    [[self sharedInstance] POST:path
                     parameters:dict
                       progress:nil
                        success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
                            id dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
                            complete(dict, nil);
                        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                            complete(nil, error);
                        }];
}


+ (void)EncryptPOST:(NSString *)path parameters:(NSString *)params completionHandler:(void(^)(id responseObj, NSError *error))complete{
    if (!secdata) {
        [self getSecData];
    }
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setObject:secdata forKey:@"_secdata"];
    if (params) {
        NSString *baseParam = [self base64Encoding:params];
        [dict setObject:baseParam forKey:@"param"];
    }
    [[self sharedInstance] POST:path
                     parameters:dict
                       progress:nil
                        success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
                            NSData *resData = [[NSData alloc] initWithData:[[self base64Decoding:responseObject] dataUsingEncoding:NSUTF8StringEncoding]];
                            id dict = [NSJSONSerialization JSONObjectWithData:resData options:NSJSONReadingAllowFragments error:nil];
                            complete(dict, nil);
                        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
                            complete(nil, error);
                        }];
    
    
}

+ (void)CommentPOST:(NSString *)path parameters:(NSString *)params completionHandler:(void(^)(id responseObj, NSError *error))complete{
    
    NSURL *nsurl = [NSURL URLWithString:path];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:nsurl];
    //    如果想要设置网络超时的时间的话，可以使用下面的方法：
    //    NSMutableURLRequest *mutableRequest=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    
    //    设置请求类型
    request.HTTPMethod = @"POST";
    
    //    把参数放到请求体内
    
    request.HTTPBody = [params dataUsingEncoding:NSUTF8StringEncoding];
    
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        if (error) { //请求失败
            
            dispatch_async(dispatch_get_main_queue(), ^{
                complete(nil, error);
            });
        } else {  //请求成功
            NSString * dataString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
            
            dispatch_async(dispatch_get_main_queue(), ^{
                complete(dataString, nil);
            });
        }
    }];
    [dataTask resume];  //开始请求
    
    
}



//+ (void)UpLoad:(NSString *)path parameters:(NSString *)params andImageName:(NSString *)imageName  andImage:(UIImage *)image completionHandler:(void(^)(id responseObj, NSError *error))complete{
//    if (!secdata) {
//        [self getSecData];
//    }
//    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
//    [dict setObject:secdata forKey:@"_secdata"];
//    if (params) {
//        NSString *baseParam = [self base64Encoding:params];
//        [dict setObject:baseParam forKey:@"param"];
//    }
//    [[self sharedInstance] POST:path
//                     parameters:dict
//      constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
//          [formData appendPartWithFileData:UIImagePNGRepresentation(image)
//                                      name:@"Filedata"
//                                  fileName:imageName
//                                  mimeType:@"image/png"];
//      }
//                       progress:nil
//                        success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
//                            NSData *resData = [[NSData alloc] initWithData:[[self base64Decoding:responseObject] dataUsingEncoding:NSUTF8StringEncoding]];
//                            id dict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingAllowFragments error:nil];
//                            complete(dict, nil);
//                        }
//                        failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
//                            complete(nil, error);
//                        }];
//}


+ (void)getSecData{
    UIDevice *device = [[UIDevice alloc] init];
    NSString *model = device.model;
    NSString *systemVersion = device.systemVersion;
    NSString *systemName = device.systemName;
    NSString *nowVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
    NSString *mConnectType = [[NSString alloc] initWithFormat:@"%@",info.currentRadioAccessTechnology];
    NSString *currentDeviceModel = [self getCurrentDeviceModel];
    NSString *str = [NSString stringWithFormat:@"_uuid=%@&_dname=%@&_version=%@&_appversion=%@&_model=%@&_network=%@&_systemtype=%@",[[[UIDevice currentDevice] identifierForVendor] UUIDString],model,systemVersion,nowVersion,currentDeviceModel,mConnectType,systemName];
    NSData* originData = [str dataUsingEncoding:NSASCIIStringEncoding];
    NSString* encodeResult = [originData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
    secdata = encodeResult;
}


#pragma mark base64加密
+ (NSString *)base64Encoding:(NSString *)encoingStr{
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    NSData *data = [encoingStr dataUsingEncoding:NSUTF8StringEncoding];
    NSString *baseStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    return baseStr;
}

+ (NSString *)base64Decoding:(NSString *)decodingStr{
    NSData *nsdataFromBase64String = [[NSData alloc] initWithBase64EncodedString:decodingStr options:0];
    NSString *base64Decoded = [[NSString alloc] initWithData:nsdataFromBase64String encoding:NSUTF8StringEncoding];
    return base64Decoded;
}

#pragma mark  --获取当前设备类型
+ (NSString *)getCurrentDeviceModel
{
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *platform = [NSString stringWithFormat:@"%s", systemInfo.machine];
    //    if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone 2G (A1203)";
    //    if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone 3G (A1241/A1324)";
    //    if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone 3GS (A1303/A1325)";
    //    if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone 4 (A1332)";
    //    if ([platform isEqualToString:@"iPhone3,2"]) return @"iPhone 4 (A1332)";
    //    if ([platform isEqualToString:@"iPhone3,3"]) return @"iPhone 4 (A1349)";
    //    if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone 4S (A1387/A1431)";
    //    if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone 5 (A1428)";
    //    if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone 5 (A1429/A1442)";
    //    if ([platform isEqualToString:@"iPhone5,3"]) return @"iPhone 5c (A1456/A1532)";
    //    if ([platform isEqualToString:@"iPhone5,4"]) return @"iPhone 5c (A1507/A1516/A1526/A1529)";
    //    if ([platform isEqualToString:@"iPhone6,1"]) return @"iPhone 5s (A1453/A1533)";
    //    if ([platform isEqualToString:@"iPhone6,2"]) return @"iPhone 5s (A1457/A1518/A1528/A1530)";
    //    if ([platform isEqualToString:@"iPhone7,1"]) return @"iPhone 6 Plus (A1522/A1524)";
    //    if ([platform isEqualToString:@"iPhone7,2"]) return @"iPhone 6 (A1549/A1586)";
    //
    //    if ([platform isEqualToString:@"iPod1,1"])   return @"iPod Touch 1G (A1213)";
    //    if ([platform isEqualToString:@"iPod2,1"])   return @"iPod Touch 2G (A1288)";
    //    if ([platform isEqualToString:@"iPod3,1"])   return @"iPod Touch 3G (A1318)";
    //    if ([platform isEqualToString:@"iPod4,1"])   return @"iPod Touch 4G (A1367)";
    //    if ([platform isEqualToString:@"iPod5,1"])   return @"iPod Touch 5G (A1421/A1509)";
    //
    //    if ([platform isEqualToString:@"iPad1,1"])   return @"iPad 1G (A1219/A1337)";
    //
    //    if ([platform isEqualToString:@"iPad2,1"])   return @"iPad 2 (A1395)";
    //    if ([platform isEqualToString:@"iPad2,2"])   return @"iPad 2 (A1396)";
    //    if ([platform isEqualToString:@"iPad2,3"])   return @"iPad 2 (A1397)";
    //    if ([platform isEqualToString:@"iPad2,4"])   return @"iPad 2 (A1395+New Chip)";
    //    if ([platform isEqualToString:@"iPad2,5"])   return @"iPad Mini 1G (A1432)";
    //    if ([platform isEqualToString:@"iPad2,6"])   return @"iPad Mini 1G (A1454)";
    //    if ([platform isEqualToString:@"iPad2,7"])   return @"iPad Mini 1G (A1455)";
    //
    //    if ([platform isEqualToString:@"iPad3,1"])   return @"iPad 3 (A1416)";
    //    if ([platform isEqualToString:@"iPad3,2"])   return @"iPad 3 (A1403)";
    //    if ([platform isEqualToString:@"iPad3,3"])   return @"iPad 3 (A1430)";
    //    if ([platform isEqualToString:@"iPad3,4"])   return @"iPad 4 (A1458)";
    //    if ([platform isEqualToString:@"iPad3,5"])   return @"iPad 4 (A1459)";
    //    if ([platform isEqualToString:@"iPad3,6"])   return @"iPad 4 (A1460)";
    //
    //    if ([platform isEqualToString:@"iPad4,1"])   return @"iPad Air (A1474)";
    //    if ([platform isEqualToString:@"iPad4,2"])   return @"iPad Air (A1475)";
    //    if ([platform isEqualToString:@"iPad4,3"])   return @"iPad Air (A1476)";
    //    if ([platform isEqualToString:@"iPad4,4"])   return @"iPad Mini 2G (A1489)";
    //    if ([platform isEqualToString:@"iPad4,5"])   return @"iPad Mini 2G (A1490)";
    //    if ([platform isEqualToString:@"iPad4,6"])   return @"iPad Mini 2G (A1491)";
    //
    //    if ([platform isEqualToString:@"i386"])      return @"iPhone Simulator";
    //    if ([platform isEqualToString:@"x86_64"])    return @"iPhone Simulator";
    return platform;
}

+ (NSError *)createError:(NSString *)str{
    return [U9CustomeError createError:str];
}


#pragma mark base64加密
//+ (NSString *)base64Encoding:(NSString *)encoingStr{
//    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
//    NSData *data = [encoingStr dataUsingEncoding:NSUTF8StringEncoding];
//    NSString *baseStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
//    return baseStr;
//}
//
//+ (NSString *)base64Decoding:(NSString *)decodingStr{
//    NSData *nsdataFromBase64String = [[NSData alloc] initWithBase64EncodedString:decodingStr options:0];
//    NSString *base64Decoded = [[NSString alloc] initWithData:nsdataFromBase64String encoding:NSUTF8StringEncoding];
//    return base64Decoded;
//}


@end
